package pl.charmas.android.reactivelocation.observables.geocode; import android.content.Context; import android.location.Address; import android.location.Geocoder; import java.io.IOException; import java.util.List; import java.util.Locale; import rx.Observable; import rx.Subscriber; import rx.schedulers.Schedulers; public class ReverseGeocodeObservable implements Observable.OnSubscribe<List<Address>> { private final Context ctx; private final Locale locale; private final double latitude; private final double longitude; private final int maxResults; public static Observable<List<Address>> createObservable(Context ctx, Locale locale, double latitude, double longitude, int maxResults) { return Observable.create(new ReverseGeocodeObservable(ctx, locale, latitude, longitude, maxResults)); } private ReverseGeocodeObservable(Context ctx, Locale locale, double latitude, double longitude, int maxResults) { this.ctx = ctx; this.latitude = latitude; this.longitude = longitude; this.maxResults = maxResults; this.locale = locale; } @Override public void call(final Subscriber<? super List<Address>> subscriber) { Geocoder geocoder = new Geocoder(ctx, locale); try { subscriber.onNext(geocoder.getFromLocation(latitude, longitude, maxResults)); subscriber.onCompleted(); } catch (IOException e) { // If it's a service not available error try a different approach using google web api if (e.getMessage().equalsIgnoreCase("Service not Available")) { Observable .create(new FallbackReverseGeocodeObservable(locale, latitude, longitude, maxResults)) .subscribeOn(Schedulers.io()) .subscribe(subscriber); } else { subscriber.onError(e); } } } }